#include "citytocitycode.h"



QMap<QString,QString>CityToCityCode::m_cityMap = {};        //初始化变量m_cityMap


//初始化容器
void CityToCityCode::initCityMap()
{
    //如果映射表已经初始化，则直接返回
    if(!m_cityMap.isEmpty())
    {
        return;
    }


    //打开城市代码Json文件
    QFile file(":/city/citycode.json");
    //如果不是以只读和文本形式打开文件
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qWarning() << "Failed to open city code file:" << file.errorString();       //打印打开文件失败
    }

    //读取文件并解析为JSON
    QJsonParseError error;      //创建QJsonParseError错误对象
    QJsonDocument doc = QJsonDocument::fromJson(file.readAll(),&error);    //读取文件内容转化为QJsonDocument对象
     //如果解析出来的文件有误或者不是数组，因为城市编码的Json文件是数组包含对象
    if(error.error!=QJsonParseError::NoError || !doc.isArray() )
    {
        qWarning() << "JSON parse error:" << error.errorString();       //打印错误信息
        return;
    }

    //遍历数组，提取城市名称和城市代码
    for(const auto& item : doc.array())
    {
        QJsonObject cityobj = item.toObject();     //将JSON数组转化为QJsonObject对象
        QString cityName = cityobj["city_name"].toString();     //从QJsonObject对象中获取名为city_name的对象值，作为城市名称
        QString cityCode = cityobj["city_code"].toString();     //从QJsonObject对象中获取名为city_code的对象值，作为城市编码

        //如果城市编码不为空
        if(!cityCode.isEmpty())
        {
            m_cityMap.insert(cityName,cityCode);       //将有效的城市名称和城市编码插入映射表
        }


    }

    // 打印加载的城市数量
    int count = 0;          //初始化城市计数器
    for (const auto& item : doc.array()) {
        QJsonObject obj = item.toObject();
        QString name = obj["city_name"].toString().trimmed(); // 去除前后空格
        QString code = obj["city_code"].toString().trimmed();

        if (!name.isEmpty() && !code.isEmpty()) {
            m_cityMap.insert(name, code);
            if (name.contains("广州")) { // 调试输出广州相关信息
                qDebug() << "找到广州条目：" << name << "=>" << code;
            }
            count++;
        }
    }
    qDebug() << "共加载城市数量：" << count;
}

//搜索城市
QString CityToCityCode::citySearch(const QString &cityName)
{
    //如果容器为空，说明没有初始化
    if(m_cityMap.isEmpty())
    {
        initCityMap();      //初始化容器

        //如果数据仍然为空，直接返回
        if(m_cityMap.isEmpty())
        {
            qCritical() << "城市数据未加载";
            return  QString();
        }
    }

    QString searchName = cityName.trimmed();
    qDebug() << "正在搜索城市：" << searchName;

    //1、直接匹配
    if(m_cityMap.contains(searchName))          //判断容器中是否包含名字
    {
        qDebug() << "直接匹配成功：" << searchName;
        return m_cityMap[searchName];
    }

    //2、处理常见后缀（市/区/县）
    QStringList suffixes = {"市", "区", "县"};
    //遍历查找
    for(const QString &suffix : suffixes)
    {
        QString fullName = searchName + suffix;        //组合后缀

        if(m_cityMap.contains(fullName))
        {
            qDebug() << "后缀匹配成功：" << fullName;
            return m_cityMap[fullName];
        }
    }

    //3、处理输入带后缀的情况
    for (const QString &suffix : suffixes) {
        //输入的名字后缀是否包含"市", "区", "县"
        if (searchName.endsWith(suffix))
        {
            //截取字符串，去除后缀
            QString shortName = searchName.left(searchName.length() - 1);
            if (m_cityMap.contains(shortName)) {
                qDebug() << "去除后缀匹配成功：" << shortName;
                return m_cityMap[shortName];
            }
        }
    }

    // 4. 模糊匹配（包含关系）

    //遍历每个键值对
    for (auto it = m_cityMap.begin(); it != m_cityMap.end(); ++it)
    {
        //检查当前城市名称是否包含搜索字符串
        if (it.key().contains(searchName))
        {
            qDebug() << "模糊匹配成功：" << it.key();
            return it.value();     //返回匹配到的城市编码
        }
    }

    qWarning() << "未找到城市：" << searchName;
    return QString();       //返回空字符串
}


